<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');

require_once APPPATH . 'controllers/admin.php';

/**
 * Контроллер создания и изменения контента
 *
 * @package CoreFramework
 * @version 1.0
 * @author Gennadiy Kozlenko
 */
class Admin_Update_Content extends Admin {
   
   /**
    * Идентификатор контента
    *
    * @access private
    * @var integer
    */
   var $_id_content = 0;
   
   /**
    * Идентификатор меню
    *
    * @access private
    * @var integer
    */
   var $_id_menu = 0;
   
   /**
    * Идентификатор родительской категории
    * Используется только для проверки
    *
    * @access private
    * @var mixed
    */
   var $_id_parent = null;
   
   /**
    * Конструктор класса
    *
    * @access public
    * @return Admin_Update_Content
    */
   function Admin_Update_Content() {
      parent::Admin();
      $this->set_menu(4, 1);
      // Получаем идентификатор меню
      $this->load->model('m_table');
      $this->m_table->set_table('menus');
      if (false !== $this->input->get('menu')) {
         $this->_id_menu = (int) $this->input->get('menu');
         $this->m_table->add_restriction('id_menu', $this->_id_menu);
         $this->m_table->load_results();
         if (0 == $this->m_table->get_count()) {
            $this->_id_menu = 0;
         }
      }
      if (0 == $this->_id_menu) {
         $this->m_table->clean_restrictions();
         $this->m_table->add_sort('position');
         $this->m_table->set_limit(1);
         $this->m_table->load_results();
         if (0 < $this->m_table->get_count()) {
            $result = $this->m_table->next_result();
            $this->_id_menu = (int) $result['id_menu'];
         } else {
            $this->redirect('admin');
         }
      }
      // Получаем идентификатор контента
      if (false !== $this->input->get('id')) {
         $this->_id_content = (int) $this->input->get('id');
      }
      // Подгружаем модельки
      $this->load->model('m_menu');
      $this->m_menu->set_id($this->_id_menu);
      $this->load->model('m_content');
      $this->m_content->set_id($this->_id_content);
   } // end Admin_Update_Content
   
   /**
    * Метод по умолчанию
    *
    * @access public
    */
   function index() {
      $data = array();
      // Стандартные поля
      $id_parent = $this->m_content->get('id_parent');
      $name = $this->m_content->get('name');
      $title = $this->m_content->get('title');
      $link = $this->m_content->get('link');
      $image = $this->m_content->get('image');
      $document = $this->m_content->get('document');
      $document_name = $this->m_content->get('document_name');
      $document_type = $this->m_content->get('document_type');
      $content = $this->m_content->get('content');
      $page_title = $this->m_content->get('page_title');
      $page_keywords = $this->m_content->get('page_keywords');
      $page_description = $this->m_content->get('page_description');
      $id_template = $this->m_content->get('id_template');
      
      // Валидируем и, если нужно, изменяем контент
      if (false !== $this->input->post('edit')) {
         $id_parent = (int) $this->input->post('parent');
         if (0 == $id_parent) {
            $id_parent = null;
         }
         $this->_id_parent = $id_parent;
         $name = trim($this->input->post('uri_segment'));
         $title = trim($this->input->post('title'));
         $link = trim($this->input->post('link'));
         $content = trim($this->input->post('content'));
         $page_title = trim($this->input->post('page_title'));
         $page_keywords = trim($this->input->post('page_keywords'));
         $page_description = trim($this->input->post('page_description'));
         $id_template = $id_template = (int) $this->input->post('template');
         
         $this->load->library('validation');
         $rules = array(
            'uri_segment' => 'trim|callback_check_content_name|max_length[200]',
            'title'       => 'trim|required|max_length[200]',
            'link'        => 'trim|callback_check_content_link|max_length[255]'
         );
         $this->validation->set_rules($rules);
         $result = $this->validation->run();
         
         // Получаем документ
         $config = array(
            'upload_path'   => $this->config->item('upload_path'),
            'allowed_types' => 'xls|xlsx|doc|docx|ppt|pptx',
            'max_size'      => 10240,
            'encrypt_name'  => true
         );
         $this->load->library('upload', $config);
         if (isset($_FILES['document'])) {
            if ($this->upload->do_upload('document')) {
               $file_data = $this->upload->data();
               $this->firephp->log($file_data);
               // Перемещаем изображение в нужную папку
               $path = 'data/documents/' . substr($file_data['file_name'], 0, 2) . '/';
               $full_path = BASEPATH . '../' . $path;
               if (!file_exists($full_path)) {
                  mkdir($full_path, 0777, true);
               }
               if (copy($file_data['full_path'], $full_path . $file_data['file_name'])) {
                  // Все удачно прошло
                  $document = $path . $file_data['file_name'];
                  $document_name = $file_data['orig_name'];
               } else {
                  // Неудалось закачать файл
                  $this->errors->set('document', $this->lang->line('upload_destination_error'));
                  $result = false;
               }
               // Удаляем файл из временной папки
               @unlink($file_data['full_path']);
            } else {
               $document = '';
               $document_name = '';
               $file = '';
               if (isset($_FILES['document']) && isset($_FILES['document']['tmp_name'])) {
                  $file = $_FILES['document']['tmp_name'];
               }
               if (!is_uploaded_file($file) && '' != $this->input->post('hidden_document')) {
                  $document = $this->input->post('hidden_document');
                  $document_name = $this->input->post('hidden_document_name');
               } elseif (is_uploaded_file($file)) {
                  $this->errors->set('document', $this->upload->display_errors('', ''));
                  $result = false;
               }
            }
         }
         
         if (!empty($document)) {
            // Получаем тип документа
            $document_type = substr($document, strpos($document, '.') + 1, 3);
         }
         
         // Получаем изображение
         $config['allowed_types'] = 'jpg|gif|png';
         if (isset($_FILES['image'])) {
            $this->upload->initialize($config);;
            if ($this->upload->do_upload('image')) {
               $file_data = $this->upload->data();
               $this->firephp->log($file_data);
               // Перемещаем изображение в нужную папку
               $path = 'data/images/' . substr($file_data['file_name'], 0, 2) . '/';
               $full_path = BASEPATH . '../' . $path;
               if (!file_exists($full_path)) {
                  mkdir($full_path, 0777, true);
               }
               if (copy($file_data['full_path'], $full_path . $file_data['file_name'])) {
                  // Все удачно прошло
                  $image = $path . $file_data['file_name'];
               } else {
                  // Неудалось закачать файл
                  $this->errors->set('image', $this->lang->line('upload_destination_error'));
                  $result = false;
               }
               // Удаляем файл из временной папки
               @unlink($file_data['full_path']);
            } else {
               $image = '';
               $file = '';
               if (isset($_FILES['image']) && isset($_FILES['image']['tmp_name'])) {
                  $file = $_FILES['image']['tmp_name'];
               }
               if (!is_uploaded_file($file) && '' != $this->input->post('hidden_image')) {
                  $image = $this->input->post('hidden_image');
               } elseif (is_uploaded_file($file)) {
                  $this->errors->set('image', $this->upload->display_errors('', ''));
                  $result = false;
               }
            }
         }
         
         if ($result) {
            // Если проверки пройдены успешно, изменяем контент
            if (0 == $this->_id_content) {
               $this->m_content->set('id_menu', $this->_id_menu);
               $this->m_content->set('datetime', time());
               $this->m_content->set('status', 'active');
               // Вычисляем максимальный position
               $position = 1;
               $this->load->model('m_table');
               $this->m_table->set_table('contents');
               $this->m_table->add_restriction('id_menu', $this->_id_menu);
               $this->m_table->add_restriction('id_parent', $id_parent);
               $this->m_table->set_sort('position', false);
               $this->m_table->set_limit(1);
               if (0 < $this->m_table->get_count()) {
                  $res = $this->m_table->next_result();
                  $position = $res['position'] + 1;
               }
               $this->m_content->set('position', $position);
            }
            if (empty($name)) {
               // Генерируем uri segment (если не задан)
               $this->load->helper('text');
               // Транслитерируем
               $uri_segment = transliteration($title);
               // Строим урл
               $uri_segment = url_title($uri_segment, 'dash', true);
               // Лимитируем
               $uri_segment = substr($uri_segment, 0, 200);
               // Подстраиваем uri segment так, чтобы он был уникальным в пределах нужного уровня
               $i = 0;
               $sep = '-';
               if (empty($uri_segment)) {
                  $sep = '';
               }
               $name = $uri_segment;
               while (empty($name) || !$this->check_content_name($name)) {
                  $name = $uri_segment . $sep . (string) ++$i;
               }
            }
            if (!empty($link)) {
               $link = str_replace(base_url(), '{%base_url%}', $link);
            }
            if (!empty($content)) {
               $content = str_replace(base_url(), '{%base_url%}', $content);
            }
            $this->m_content->set('id_parent', $id_parent);
            $this->m_content->set('name', $name);
            $this->m_content->set('title', $title);
            $this->m_content->set('link', $link);
            $this->m_content->set('image', $image);
            $this->m_content->set('document', $document);
            $this->m_content->set('document_name', $document_name);
            $this->m_content->set('document_type', $document_type);
            $this->m_content->set('content', $content);
            $this->m_content->set('page_title', $page_title);
            $this->m_content->set('page_keywords', $page_keywords);
            $this->m_content->set('page_description', $page_description);
            $this->m_content->set('id_template', $id_template);
            // Сохраняем в базу
            if ($this->m_content->update()) {
               if (0 == $this->_id_content) {
                  $this->set_message($this->lang->line('add_content_succ'), 'info', true);
               } else {
                  $this->set_message($this->lang->line('edit_content_succ'), 'info', true);
               }
               $this->redirect('admin_manage_contents', 'index', array('menu' => $this->_id_menu));
            }
            // Если сюда пришли, значит не все в порядке...
            if (0 == $this->_id_content) {
               $this->set_message($this->lang->line('add_content_error'), 'error');
            } else {
               $this->set_message($this->lang->line('edit_content_error'), 'error');
            }
         }
      }
      // Формируем dropdown меню выбора родительского меню
      $parents = array();
      $this->load->model('m_table');
      $this->m_table->set_table('contents');
      $this->m_table->add_restriction('status', 'deleted', '<>');
      $this->m_table->add_restriction('link', '');
      $this->m_table->add_restriction('id_menu', $this->_id_menu);
      $this->m_table->add_sort('position');
      $this->load->helper('tree');
      $tree = array_tree($this->m_table->get_results(), 'id_content', 'id_parent');
      $items = collapse_tree($tree, 'level');
      // Если это редактирование, то убираем ветвь, порожденную этим элементом (во избежании создания замкнутых цепей)
      if (0 < $this->_id_content) {
         $curr_level = PHP_INT_MAX;
         foreach ($items as $id => $item) {
            if ($item['id_content'] == $this->_id_content) {
               $curr_level = $item['level'];
               unset($items[$id]);
               continue;
            }
            if ($item['level'] > $curr_level) {
               unset($items[$id]);
            } else {
               $curr_level = PHP_INT_MAX;
            }
         }
      }
      // Если нужно, убиваем лишние ветки дерева
      if (1 < $this->m_menu->get('levels')) {
         foreach ($items as $id => $item) {
            if ($item['level'] + 1 >= $this->m_menu->get('levels')) {
               unset($items[$id]);
            }
         }
      } elseif (1 == $this->m_menu->get('levels')) {
         $data['parent_exists'] = array();
      }
      $parents[0] = $this->lang->line('top');
      foreach ($items as $item) {
         $parents[$item['id_content']] = str_repeat('&nbsp;&nbsp;&nbsp;', $item['level'] + 1) . htmlspecialchars($item['title']); 
      }
      // Список шаблонов
      $templates = array(0 => $this->lang->line('not_use'));
      $this->load->model('m_table');
      $this->m_table->set_table('templates');
      $this->m_table->load_results();
      foreach ($this->m_table->get_results() as $result) {
         $templates[(int) $result['id_template']] = htmlspecialchars($result['name']);
      }
      // Забиваем в дату поля
      $this->load->helper('element');
      $data['id'] = $this->_id_content;
      $data['id_menu'] = $this->_id_menu;
      $data['templates'] = create_select('template', $templates, $id_template, 'class="i"');
      $data['parents'] = create_select('parent', $parents, $id_parent, 'class="i"');
      $data['uri_segment'] = htmlspecialchars($name);
      $data['title'] = htmlspecialchars($title);
      $data['link'] = $link;
      $data['document_exists'] = !empty($document) ? array(array()) : array();
      $data['document'] = $document;
      $data['document_name'] = $document_name;
      $data['document_type'] = $document_type;
      $data['image_exists'] = !empty($image) ? array(array()) : array();
      $data['image'] = $image;
      $data['content'] = $content;
      $data['advanced'] = false !== $this->input->post('advanced') ? '1' : '';
      $data['page_title'] = $page_title;
      $data['page_keywords'] = $page_keywords;
      $data['page_description'] = $page_description;
      // Выводим
      $view = 'admin/edit_content.html';
      if (0 == $this->_id_content) {
         $view = 'admin/add_content.html';
      }
      $this->set_content($this->parser->parse($view, $data, true));
      $this->display();
   } // end index
   
   /**
    * Функция валидирования uri сегмента на уникальность
    *
    * @access public
    * @param string $name
    * @return boolean
    */
   function check_content_name($name) {
      if (!empty($name)) {
         if ($this->validation->alpha_dash($name)) {
            $this->load->model('m_table');
            $this->m_table->set_table('contents');
            $this->m_table->add_restriction('name', $name);
            $this->m_table->add_restriction('id_parent', 0 < $this->_id_parent ? $this->_id_parent : null);
            $this->m_table->add_restriction('id_menu', $this->_id_menu);
            $this->m_table->add_restriction('id_content', $this->_id_content, '<>');
            $this->m_table->load_results();
            if (0 == $this->m_table->get_count()) {
               return true;
            }
         } else {
            $this->validation->set_message('check_content_name', $this->lang->line('alpha_dash'));
         }
         return false;
      }
      return true;
   } // end check_content_name
   
   /**
    * Функция валидирования ссылки
    *
    * @access public
    * @param string $link
    * @return boolean
    */
   function check_content_link($link) {
      if (!empty($link)) {
         return $this->validation->valid_url($link);
      }
      return true;
   } // end check_content_link
   
   /**
    * Метод получения HTML представления пользовательского меню
    *
    * @access protected
    * @return string
    */
   function _get_menu() {
      $output = parent::_get_menu();
      $output = str_replace('{%id_menu%}', $this->_id_menu, $output);
      return $output;
   } // end _get_menu
   
}
